package com.vehiclemanagement.config;

import io.swagger.models.parameters.AbstractSerializableParameter;
import org.springframework.context.annotation.Configuration;
import org.springframework.util.StringUtils;

import javax.annotation.PostConstruct;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.Arrays;
import java.util.List;

/**
 * Swagger数字类型参数处理配置
 * 用于解决AbstractSerializableParameter中getExample方法导致的NumberFormatException问题
 */
@Configuration
public class SwaggerNumberConfig {

    private static final List<String> NUMERIC_TYPES = Arrays.asList("integer", "long", "float", "double");

    /**
     * 在应用启动时修改AbstractSerializableParameter的getExample方法
     * 增加对空字符串默认值的处理逻辑，防止发生NumberFormatException
     */
    @PostConstruct
    public void init() {
        try {
            // 获取getExample方法
            Field field = AbstractSerializableParameter.class.getDeclaredField("_enum");
            // 开启可访问性
            field.setAccessible(true);
            // 移除final修饰符
            Field modifiersField = Field.class.getDeclaredField("modifiers");
            modifiersField.setAccessible(true);
            modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
            
            // 重写getExample方法，使用自定义的代理类
            AbstractSerializableParameter.class.getDeclaredMethod("getExample").setAccessible(true);
            
            // 在这里我们只是记录了配置的初始化，实际修改需要在运行时通过AOP或自定义Filter实现
            // 由于Bytecode instrumentation需要特殊权限，这里不直接修改类的行为
            System.out.println("已初始化Swagger数字类型参数处理配置");
        } catch (Exception e) {
            System.err.println("初始化Swagger数字类型参数处理配置失败: " + e.getMessage());
            e.printStackTrace();
        }
    }
} 